import { EventDispatcher } from "../../app_base/base/event/EventDispatcher";
import { IView } from "../../app_base/module/view/IView";
import { ViewConfig } from "../../app_base/module/view/IViewLoader";
import { app } from "../../base";
import { Scene } from "./Scene";
import { View } from "./View";

/**
 * 视图控制器
 * 在当前Scene创建，并被所有View持有。
 */
export class ViewControl extends EventDispatcher {
    /**
     * 添加视图到主视图
     * @param config 视图配置
     * @param data 传入视图setData的数据
     */
    public addView<T extends View>(config: { prototype: IView } | ViewConfig, ...data: any[]): Promise<T> {
        return this.addViewTo(config, app.viewManager.view(), ...data);
    }

    /**
     * 添加视图到目标父级视图
     * @param config 视图配置
     * @param parent 目标父级视图
     * @param data 传入视图setData的数据
     */
    public addViewTo<T extends View>(config: { prototype: IView } | ViewConfig, parent?: IView, ...data: any[]): Promise<T> {
        if (parent == app.viewManager.scene()) {
            console.warn(`目标父级视图为当前场景:${app.viewManager.scene<Scene>().sceneName}, 可能会存在视图无法释放`)
        }
        return app.viewManager.addView(config, parent, ...data);
    }

    /**
     * 将主视图切换到目标视图，并移除之前主视图
     * @param config 视图配置
     * @param data 传给视图的其他参数
     */
    public switchView<T extends View>(config: { prototype: IView } | ViewConfig, ...data: any[]): Promise<T> {
        return app.viewManager.switchTo<T>(config, ...data);
    }

    /**
     * 切回当前主视图到上一个主视图。
     * @param data 
     * @returns 
     */
    public switchBack<T extends View>(...data: any[]): Promise<T> {
        return app.viewManager.switchBack<T>(...data);
    }

    /**
     * 显示提示
     * @param message 提示文本内容
     */
    public tips(message: string) {
        app.viewManager.scene().tips(message);
    }

    /**
     * 显示警告
     * @param message 警告文本内容
     */
    public warn(message: string) {
        app.viewManager.scene().warn(message);
    }

    /**
     * 显示错误
     * @param message 错误文本内容
     */
    public error(message: string) {
        app.viewManager.scene().error(message);
    }
}
